package br.com.vilababy.sigvb.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.NoResultException;

import br.com.vilababy.sigvb.SIGVBFactory;
import br.com.vilababy.sigvb.SIGVBUtil;
import br.com.vilababy.sigvb.constantes.RelacaoEnum;
import br.com.vilababy.sigvb.constantes.SIGVBEnum;
import br.com.vilababy.sigvb.modelo.Aluno;
import br.com.vilababy.sigvb.modelo.Responsavel;

public class ResponsavelDAO extends AbstractSIGVBDAO<Responsavel>{

	/**
	 * @author Diego Patrick da Silva Santos
	 */
	protected ResponsavelDAO() {
		if (SIGVBFactory.getEM() == null)
			SIGVBFactory.createEntityManager();
	}
	
	@Override
	public int getQuantidadeFiltrados() {
		this.consulta = new StringBuilder("SELECT COUNT (r) FROM Responsavel r");
		this.query = SIGVBFactory.getEM().createQuery(this.consulta.toString());
		Number totalRegistros = (Number) query.getSingleResult();
		return totalRegistros.intValue();
	}
	
	@SuppressWarnings("unchecked")
	public List<String> consultarNome(Responsavel responsavel) {
		this.consulta = new StringBuilder("SELECT nome FROM Responsavel r WHERE r.relacao = :relacao AND r.nome LIKE :nome");
		this.query = SIGVBFactory.getEM().createQuery(this.consulta.toString());
		this.query.setParameter("relacao", responsavel.getRelacao());
		this.query.setParameter("nome", "%" + responsavel.getNome() + "%");
		
		try {
			return  this.query.getResultList();
		} catch (NullPointerException nex) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO_VAZIO.getValor()));
			return new ArrayList<String>();
		} catch (NoResultException rex) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO_VAZIO.getValor()));
			return new ArrayList<String>();
		}

	}
	
	@SuppressWarnings("unchecked")
	public List<Responsavel> consultarPaisAluno(Aluno aluno) {
		this.consulta = new StringBuilder("FROM Responsavel r WHERE r.aluno = :aluno AND (r.relacao = :pai OR r.relacao = :mae)");
		this.query = SIGVBFactory.getEM().createQuery(this.consulta.toString());
		this.query.setParameter("aluno", aluno);
		this.query.setParameter("pai", RelacaoEnum.PAI);
		this.query.setParameter("mae", RelacaoEnum.MAE);
		
		try {
			return  this.query.getResultList();
		} catch (NullPointerException nex) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO_VAZIO.getValor()));
			return new ArrayList<Responsavel>();
		} catch (NoResultException rex) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO_VAZIO.getValor()));
			return new ArrayList<Responsavel>();
		}
	}

	public Responsavel consultar(Responsavel responsavel) {
		this.consulta = new StringBuilder("FROM Responsavel r WHERE 1 = 1 ");
		
		if (responsavel.getNome() != null && !responsavel.getNome().isEmpty())
			consulta.append("AND r.nome LIKE :nome");
		
		this.query = SIGVBFactory.getEM().createQuery(this.consulta.toString());
		
		if (responsavel.getNome() != null && !responsavel.getNome().isEmpty())
			this.query.setParameter("nome", responsavel.getNome());
		
		try {
			return (Responsavel) this.query.getSingleResult();
		} catch (NullPointerException nex) {
			return new Responsavel();
		} catch (NoResultException rex) {
			return new Responsavel();
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Responsavel> listarPaginacao(int primeiroRegistro, int totalRegistros) {
		this.consulta = new StringBuilder("FROM Responsavel r ORDER BY r.aluno.nome");
		this.query = SIGVBFactory.getEM().createQuery(this.consulta.toString());
		this.query.setFirstResult(primeiroRegistro);
		this.query.setMaxResults(totalRegistros);
		
		try{
			return (List<Responsavel>) this.query.getResultList();
		} catch (NullPointerException nex) {
			System.out.println("Resultado Nulo");
			return new ArrayList<Responsavel>();
		} catch (ClassCastException cex) {
			System.out.println("Cast na classe List<Responsavel> não realizado!");
			return new ArrayList<Responsavel>();
		} catch (NoResultException rex) {
			System.out.println("Não existe resultado para esta consulta!");
			return new ArrayList<Responsavel>();
		}
	}
	
	public Responsavel consultarResponsavelFinanceiro(Aluno aluno) {
		this.consulta = new StringBuilder("FROM Responsavel r WHERE r.aluno = :aluno AND r.responsavelFinanceiro");
		this.query = SIGVBFactory.getEM().createQuery(this.consulta.toString());
		this.query.setParameter("aluno", aluno);
		
		try {
			return (Responsavel) this.query.getSingleResult();
		} catch (NullPointerException nex) {
			return new Responsavel();
		} catch (NoResultException rex) {
			return new Responsavel();
		}
	}
	
	public Responsavel consultarPai(Aluno aluno) {
		this.consulta = new StringBuilder("FROM Responsavel r WHERE r.aluno = :aluno AND r.relacao = :pai");
		this.query = SIGVBFactory.getEM().createQuery(this.consulta.toString());
		this.query.setParameter("aluno", aluno);
		this.query.setParameter("pai", RelacaoEnum.PAI);
		
		try {
			return (Responsavel) this.query.getSingleResult();
		} catch (NullPointerException nex) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO_VAZIO.getValor()));
			return new Responsavel();
		} catch (NoResultException rex) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO_VAZIO.getValor()));
			return new Responsavel();
		}
	}
	
	
	public Responsavel consultarMae(Aluno aluno) {
		this.consulta = new StringBuilder("FROM Responsavel r WHERE r.aluno = :aluno AND r.relacao = :mae");
		this.query = SIGVBFactory.getEM().createQuery(this.consulta.toString());
		this.query.setParameter("aluno", aluno);
		this.query.setParameter("mae", RelacaoEnum.MAE);
		
		try {
			return (Responsavel) this.query.getSingleResult();
		} catch (NullPointerException nex) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO_VAZIO.getValor()));
			return new Responsavel();
		} catch (NoResultException rex) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO_VAZIO.getValor()));
			return new Responsavel();
		}
	}
}
